home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1996 February
/
EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso
/
earcd
/
comm2
/
kms20src.lha
/
KMSUM
/
kmsum.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-09-24
|
60KB
|
2,058 lines
/*************************************************************************
*
* Copyright (C) 1995 Thomas Schwarz
* <kmshq@ruatha.muc.de>
* <Schwarz.Thomas@fhm.de>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*************************************************************************/
#include "KMSUM.h"
#include <KMS/KMS_def.h>
/* Defines */
#define VERSION "1.23"
#define MID_ADD 1
#define MID_REMOVE 2
#define MID_UP 3
#define MID_DOWN 4
#define MID_SORT 5
#define MID_EDIT 6
#define MID_OK 7
#define MID_ABOUT 8
#define MID_SELUSER 9
#define EID_USE 20
#define EID_CANCEL 21
#define EID_SELAB 22
#define EID_NAMEAB 23
/* Escape Sequences */
#define eR "\033r"
#define eC "\033c"
#define eL "\033l"
#define eN "\033n"
#define eB "\033b"
#define eI "\033i"
#define ePB "\0332"
#define ePW "\0338"
/* Prototypes */
int main(int, char **);
BOOL InitUAF(VOID);
BOOL ReadUserList(VOID);
BOOL WriteUserList(VOID);
struct UserNode *AddUN(VOID);
VOID DeleteUN(struct UserNode *);
struct UserNode *UserCheck(STRPTR);
BOOL ParseArgs(VOID);
VOID Sense(APTR, STRPTR);
VOID ReadAccBits(VOID);
BOOL WriteAccBits(VOID);
BOOL MakeChanges(VOID);
struct KMSBase *GetKMSBase(VOID);
VOID Error(STRPTR);
VOID ConvertSpace(STRPTR);
VOID TakeUSem(BOOL);
VOID DropUSem(VOID);
VOID TakeMSem(BOOL);
VOID DropMSem(VOID);
BOOL AddUMSUser(struct UserNode *unode);
BOOL DelUMSUser(struct UserNode *unode);
/* Hooks */
SAVEDS ASM LONG list_dspfunc(
REG(a0) struct Hook *hook,
REG(a2) char **array,
REG(a1) struct UserNode *user)
{
if(user)
*array = user->UserData.Name;
else
*array = NULL;
return 0;
}
static struct Hook list_dsphook = {
{NULL, NULL},
(VOID *)list_dspfunc,
NULL, NULL
};
SAVEDS ASM LONG list_cmpfunc(
REG(a0) struct Hook *hook,
REG(a1) struct UserNode *user1,
REG(a2) struct UserNode *user2)
{
if(user1 && user2)
return stricmp(user1->UserData.Name, user2->UserData.Name);
else
return 0;
}
static struct Hook list_cmphook =
{
{NULL, NULL},
(VOID *)list_cmpfunc,
NULL, NULL
};
/* Vars */
static Object *App ; /* Application object */
static Object *WI_Manager; /* Main Window object */
static Object *WI_Editor ; /* Editor Window object */
static Object *LV_Users ; /* Users Listview object */
static Object *LV_AccBits; /* AccBits Listview object */
static Object *BT_Add ; /* Add Button object */
static Object *BT_Remove ; /* Remove Button object */
static Object *BT_Up ; /* Up Button object */
static Object *BT_Down ; /* Down Button object */
static Object *BT_Sort ; /* Sort Button object */
static Object *BT_Edit ; /* Edit Button object */
static Object *BT_EUse ; /* Edit-Use Button object */
static Object *BT_ECancel; /* Edit-Cancel Button object */
/* String-Gadget objects */
static Object *ST_Name;
static Object *ST_Password;
static Object *ST_RealName;
static Object *ST_Street;
static Object *ST_City;
static Object *ST_Phone;
static Object *ST_Prompt;
static Object *ST_AccBit;
static Object *ST_Quota;
/* Slider objects */
static Object *SL_Level;
static Object *SL_PageLen;
static Object *SL_LineLen;
/* Cycle objects */
static Object *CY_CharSet;
static Object *CY_ReadMode;
static Object *CY_Terminal;
static Object *CY_Editor;
/* CheckMark objects */
static Object *CH_MsgHead;
static Object *CH_AutoList;
static Object *CH_AutoAreaList;
static Object *CH_Input;
static Object *CH_WriteAcc;
static Object *CH_ClearScreen;
static const char *CYA_CharSets[] =
{
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
NULL
};
static const char *CYA_ReadModes[] =
{
"Next",
"Next new",
"Next selected",
"Next Reply",
NULL
};
static const char *CYA_Terminal[] =
{
"TTY",
"ANSI",
NULL
};
static const char *CYA_Editor[] =
{
"Line oriented",
"Full Screen",
NULL
};
/* Menü */
static const struct NewMenu MenuList[] =
{
{NM_TITLE, "Project", 0, 0, 0, 0},
{NM_ITEM, "About...", "?", 0, 0, (APTR)MID_ABOUT},
{NM_ITEM, NM_BARLABEL, 0, 0, 0, 0},
{NM_ITEM, "Quit", "Q", 0, 0, (APTR)MID_OK},
{NM_END, NULL, 0, 0, 0, 0}
};
/* Misc */
STRPTR Username = NULL;
ULONG UserListNum = 0;
struct Library *UMSBase = NULL;
UMSAccount SysUMSAccount = NULL;
ULONG SystemStartups;
TEXT AccBitNames[32][LEN_ACCBITNAME+1];
FILE *Changes;
TEXT ChangesFile[16];
struct KMSBase *KMSBase = NULL;
/* Hauptprogramm */
/// "main"
int main(int argc, char *argv[])
{
struct UserNode *un;
struct Userdaten user;
BOOL running = TRUE, addflag = FALSE;
BOOL userschanged = FALSE, bitschanged = FALSE;
ULONG signal, acc;
LONG num, entries, state;
TEXT password[LEN_PASSWORD+1];
sprintf(ChangesFile, "T:%08x.tmp", time(NULL));
App = NULL;
init();
if(!ParseArgs())
Sense(App, NULL);
if(!GetKMSBase())
Sense(App, NULL);
App = ApplicationObject,
MUIA_Application_Title , "KMS User Manager",
MUIA_Application_Version , "$VER: KMSUM " VERSION " (" __COMMODORE_DATE__ ")",
MUIA_Application_Copyright , "©1994 Thomas Schwarz",
MUIA_Application_Author , "Thomas Schwarz",
MUIA_Application_Description, "Manages Karfunkel Mailbox System Users.",
MUIA_Application_Base , "KMSUM",
MUIA_Application_Menu , MenuList,
MUIA_Application_SingleTask, TRUE,
SubWindow, WI_Manager = WindowObject,
MUIA_Window_ID, MAKE_ID('M','A','I','N'),
MUIA_Window_Title, "KMS User Manager",
WindowContents, VGroup,
Child, HGroup,
Child, VGroup,
GroupFrameT("Users"),
Child, LV_Users = ListviewObject,
MUIA_Listview_List, ListObject,
InputListFrame,
MUIA_List_DisplayHook, &list_dsphook,
MUIA_List_CompareHook, &list_cmphook,
End,
End,
End,
Child, VGroup,
GroupFrameT("Menu"),
MUIA_Weight, 25,
MUIA_Group_SameSize, TRUE,
Child, BT_Add = KeyButton("Add" , 'a'),
Child, BT_Remove = KeyButton("Remove", 'r'),
Child, BT_Up = KeyButton("Up" , 'u'),
Child, BT_Down = KeyButton("Down" , 'd'),
Child, BT_Sort = KeyButton("Sort" , 'o'),
Child, BT_Edit = KeyButton("Edit" , 'e'),
End,
End,
End,
End,
SubWindow, WI_Editor = WindowObject,
MUIA_Window_ID, MAKE_ID('E','D','I','T'),
MUIA_Window_Title, "KMS User Editor",
WindowContents, VGroup,
Child, HGroup,
Child, ColGroup(2),
Child, KeyLabel2("Username:", 'u'),
Child, ST_Name = StringObject,
StringFrame,
MUIA_String_MaxLen, LEN_USERNAME+1,
MUIA_ControlChar, 'u',
End,
Child, KeyLabel2("Realname:", 'e'),
Child, ST_RealName = StringObject,
StringFrame,
MUIA_String_MaxLen, LEN_REALNAME+1,
MUIA_ControlChar, 'e',
End,
Child, KeyLabel2("Street:", 't'),
Child, ST_Street = StringObject,
StringFrame,
MUIA_String_MaxLen, LEN_STREET+1,
MUIA_ControlChar, 't',
End,
Child, KeyLabel2("City:", 'y'),
Child, ST_City = StringObject,
StringFrame,
MUIA_String_MaxLen, LEN_CITY+1,
MUIA_ControlChar, 'y',
End,
Child, KeyLabel2("Phone:", 'p'),
Child, ST_Phone = StringObject,
StringFrame,
MUIA_String_MaxLen, LEN_PHONE+1,
MUIA_ControlChar, 'p',
End,
Child, KeyLabel2("New Pwd:", 'w'),
Child, ST_Password = StringObject,
StringFrame,
MUIA_String_Secret, TRUE,
MUIA_String_MaxLen, LEN_PASSWORD+1,
MUIA_ControlChar, 'w',
End,
Child, KeyLabel2("Prompt:", 'r'),
Child, ST_Prompt = StringObject,
StringFrame,
MUIA_String_MaxLen, LEN_UPROMPT+1,
MUIA_ControlChar, 'r',
End,
End,
Child, HSpace(10),
Child, VGroup,
MUIA_Weight, 25,
Child, ColGroup(2),
Child, Label2("Level:"),
Child, SL_Level = SliderObject,
MUIA_Group_Horiz , TRUE,
MUIA_Slider_Min , 0,
MUIA_Slider_Max , 255,
MUIA_Slider_Level, 0,
End,
End,
Child, VGroup,
GroupFrameT("AccessBits"),
Child, LV_AccBits = ListviewObject,
MUIA_Listview_MultiSelect, TRUE,
MUIA_Listview_List, ListObject,
InputListFrame,
End,
End,
Child, ST_AccBit = StringObject,
StringFrame,
MUIA_String_Reject, " ",
MUIA_String_MaxLen, LEN_ACCBITNAME+1,
MUIA_String_AttachedList, LV_AccBits,
End,
End,
End,
End,
Child, VSpace(0),
Child, HGroup,
Child, Label2("Chars/Line:"),
Child, SL_LineLen = SliderObject,
MUIA_Group_Horiz , TRUE,
MUIA_Slider_Min , 40,
MUIA_Slider_Max , 255,
MUIA_Slider_Level, 80,
End,
Child, HSpace(0),
Child, Label2("Lines/Page:"),
Child, SL_PageLen = SliderObject,
MUIA_Group_Horiz , TRUE,
MUIA_Slider_Min , 10,
MUIA_Slider_Max , 255,
MUIA_Slider_Level, 25,
End,
Child, HSpace(0),
Child, Label2("Quota:"),
Child, ST_Quota = StringObject,
StringFrame,
MUIA_String_MaxLen, 5,
MUIA_String_Accept, "0123456789",
MUIA_String_Integer, 5,
End,
End,
Child, VSpace(0),
Child, HGroup,
Child, ColGroup(2),
Child, Label1("Terminal:"),
Child, CY_Terminal = CycleObject,
MUIA_Cycle_Entries, CYA_Terminal,
End,
Child, Label1("Char.Set:" ),
Child, CY_CharSet = CycleObject,
MUIA_Cycle_Entries, CYA_CharSets,
End,
Child, Label1("Editor:"),
Child, CY_Editor = CycleObject,
MUIA_Cycle_Entries, CYA_Editor,
End,
Child, Label1("Read Mode:" ),
Child, CY_ReadMode = CycleObject,
MUIA_Cycle_Entries, CYA_ReadModes,
End,
End,
Child, HSpace(0),
Child, ColGroup(2),
Child, Label1("Auto-Msglist:"),
Child, CH_AutoList = CheckMark(TRUE),
Child, Label1("Auto-Arealist:"),
Child, CH_AutoAreaList = CheckMark(TRUE),
Child, Label1("Ext. Write Opt.:"),
Child, CH_WriteAcc = CheckMark(TRUE),
Child, Label1("Long Msg-Header:"),
Child, CH_MsgHead = CheckMark(TRUE),
Child, Label1("Insert Mode:"),
Child, CH_Input = CheckMark(TRUE),
Child, Label1("Clear Screen:"),
Child, CH_ClearScreen = CheckMark(TRUE),
End,
End,
Child, VSpace(0),
Child, HGroup,
MUIA_Group_SameSize, TRUE,
Child, BT_EUse = KeyButton("Ok" , 'o'),
Child, HSpace(0),
Child, BT_ECancel = KeyButton("Cancel", 'c'),
End,
End,
End,
End;
if(!App)
Sense(App, "Failed to create application.");
DoMethod(WI_Manager, MUIM_Notify, MUIA_Window_CloseRequest, TRUE, App, 2, MUIM_Application_ReturnID, MID_OK);
DoMethod(LV_Users , MUIM_Notify, MUIA_Listview_DoubleClick, TRUE, App, 2, MUIM_Application_ReturnID, MID_EDIT);
DoMethod(LV_Users , MUIM_Notify, MUIA_List_Active, MUIV_EveryTime, App, 2, MUIM_Application_ReturnID, MID_SELUSER);
DoMethod(BT_Up , MUIM_Notify, MUIA_Pressed, FALSE, App, 2, MUIM_Application_ReturnID, MID_UP);
DoMethod(BT_Down , MUIM_Notify, MUIA_Pressed, FALSE, App, 2, MUIM_Application_ReturnID, MID_DOWN);
DoMethod(BT_Add , MUIM_Notify, MUIA_Pressed, FALSE, App, 2, MUIM_Application_ReturnID, MID_ADD);
DoMethod(BT_Remove , MUIM_Notify, MUIA_Pressed, FALSE, App, 2, MUIM_Application_ReturnID, MID_REMOVE);
DoMethod(BT_Sort , MUIM_Notify, MUIA_Pressed, FALSE, App, 2, MUIM_Application_ReturnID, MID_SORT);
DoMethod(BT_Edit , MUIM_Notify, MUIA_Pressed, FALSE, App, 2, MUIM_Application_ReturnID, MID_EDIT);
DoMethod(WI_Manager, MUIM_Window_SetCycleChain, LV_Users, BT_Add,
BT_Remove, BT_Up, BT_Down, BT_Sort, BT_Edit, NULL);
set(WI_Manager, MUIA_Window_DefaultObject, LV_Users);
DoMethod(WI_Editor , MUIM_Notify, MUIA_Window_CloseRequest, TRUE, App, 2, MUIM_Application_ReturnID, EID_CANCEL);
DoMethod(BT_EUse , MUIM_Notify, MUIA_Pressed, FALSE, App, 2, MUIM_Application_ReturnID, EID_USE);
DoMethod(BT_ECancel, MUIM_Notify, MUIA_Pressed, FALSE, App, 2, MUIM_Application_ReturnID, EID_CANCEL);
DoMethod(LV_AccBits, MUIM_Notify, MUIA_List_Active, MUIV_EveryTime, App, 2, MUIM_Application_ReturnID, EID_SELAB);
DoMethod(ST_AccBit , MUIM_Notify, MUIA_String_Acknowledge, MUIV_EveryTime, App, 2, MUIM_Application_ReturnID, EID_NAMEAB);
DoMethod(WI_Editor, MUIM_Window_SetCycleChain,
ST_Name, ST_RealName, ST_Street, ST_City, ST_Phone, ST_Password,
ST_Prompt, SL_Level, LV_AccBits, ST_AccBit, SL_LineLen, SL_PageLen,
ST_Quota, CY_Terminal, CY_CharSet, CY_Editor, CY_ReadMode, CH_AutoList, CH_AutoAreaList,
CH_WriteAcc, CH_MsgHead, CH_Input, CH_ClearScreen, BT_EUse, BT_ECancel, NULL);
set(WI_Editor, MUIA_Window_DefaultObject, LV_AccBits);
TakeUSem(FALSE);
num = 0;
un = (struct UserNode *)KMSBase->UserList.mlh_Head;
while(un->Node.mln_Succ)
{
num++;
if(Username && !stricmp(Username, un->UserData.Name))
UserListNum = num;
DoMethod(LV_Users, MUIM_List_Insert, &un, 1, MUIV_List_Insert_Bottom);
un = un->Node.mln_Succ;
}
DropUSem();
STRPTR entry;
UBYTE n;
for(n = 0; n < 32; n++)
{
entry = AccBitNames[n];
DoMethod(LV_AccBits, MUIM_List_Insert, &entry, 1, MUIV_List_Insert_Bottom);
}
if(Username)
{
if(!UserListNum)
if(!MUI_RequestA(App, NULL, 0, "KMSUM Error", "Create|Abort", "No such user!", NULL))
Sense(App, NULL);
if(UserListNum)
{
set(LV_Users, MUIA_List_Active, UserListNum-1);
DoMethod(App, MUIM_Application_ReturnID, MID_EDIT);
}
else
DoMethod(App, MUIM_Application_ReturnID, MID_ADD);
}
else
{
ULONG open;
set(WI_Manager, MUIA_Window_Open, TRUE);
get(WI_Manager, MUIA_Window_Open, &open);
if(!open)
Sense(App, "Failed to open window.");
DoMethod(WI_Manager, MUIM_Window_ScreenToFront,);
}
while(running)
{
switch(DoMethod(App, MUIM_Application_Input, &signal))
{
case MID_ABOUT:
MUI_RequestA(App, NULL, 0, "Information", "Ok",
eC ePW "KMS User Manager\n\n"
ePB "Version " VERSION " (" __COMMODORE_DATE__ ")\n"
"Copyright 1994 by Thomas Schwarz.\n"
"\nThis is a MUI-Application.\n"
"MUI is copyrighted by Stefan Stuntz.", NULL);
break;
case MID_UP:
get(LV_Users, MUIA_List_Active, &num);
if(num != MUIV_List_Active_Off && num > 0)
{
DoMethod(LV_Users, MUIM_List_Exchange, num, num-1);
set(LV_Users, MUIA_List_Active, MUIV_List_Active_Up);
userschanged = TRUE;
}
else
DisplayBeep(0);
break;
case MID_DOWN:
get(LV_Users, MUIA_List_Entries, &entries);
get(LV_Users, MUIA_List_Active, &num);
if(num != MUIV_List_Active_Off && num < entries-1)
{
DoMethod(LV_Users, MUIM_List_Exchange, num, num+1);
set(LV_Users, MUIA_List_Active, MUIV_List_Active_Down);
userschanged = TRUE;
}
else
DisplayBeep(0);
break;
case MID_ADD:
un = AddUN();
if(un)
{
struct UserNode *defuser;
addflag = TRUE;
defuser = UserCheck("Default");
if (defuser)
un->UserData = defuser->UserData;
else
{
un->UserData.Level = 10;
un->UserData.Flags = UF_EMU_ANSI|UF_EDIT_INSERT|UF_RMODE_NEW|UF_SCREEN_ED|UF_AUTO_LIST|UF_AUTO_AREALIST;
strcpy(un->UserData.Prompt, "[%p]> ");
un->UserData.PageLen = 25;
un->UserData.LineLen = 80;
un->UserData.Quota = 10;
}
*un->UserData.Name = '\0';
*un->UserData.RealName = '\0';
if (Username)
strcpy(un->UserData.Name, Username);
DoMethod(App, MUIM_Application_ReturnID, MID_EDIT);
}
else
{
MUI_RequestA(App, NULL, 0, "KMSUM Error", "I see", "Couldn't create new user!", NULL);
if(Username)
DoMethod(App, MUIM_Application_ReturnID, MID_OK);
}
break;
case MID_REMOVE:
DoMethod(LV_Users, MUIM_List_GetEntry, MUIV_List_GetEntry_Active, &un);
if(un)
{
if (MUI_RequestA(App, NULL, 0, "KMSUM Request", "Just do it!|No way!", "Do you really want to delete this user?", NULL))
{
DoMethod(LV_Users, MUIM_List_Remove, MUIV_List_Remove_Active);
/* UMS-User löschen */
DelUMSUser(un);
/* User-Directory löschen */
TEXT buffer[LEN_DOSPATH+1];
strcpy(buffer, KMSBase->UserDir);
strcat(buffer, un->UserData.Name);
ConvertSpace(buffer);
Changes = fopen(ChangesFile, "a");
if(Changes)
{
fprintf(Changes, "Delete >NIL: \"%s/#?\"\n", buffer);
fprintf(Changes, "Delete >NIL: \"%s\"\n", buffer);
fclose(Changes);
}
DeleteUN(un);
userschanged = TRUE;
}
}
else
DisplayBeep(0);
break;
case MID_SORT:
DoMethod(LV_Users, MUIM_List_Sort,);
userschanged = TRUE;
break;
case MID_EDIT:
if(!addflag)
DoMethod(LV_Users, MUIM_List_GetEntry, MUIV_List_GetEntry_Active, &un);
if(un)
{
user = un->UserData;
set(ST_Name, MUIA_String_Contents, user.Name);
set(ST_Password, MUIA_String_Contents, "");
set(SL_Level, MUIA_Slider_Level, (ULONG)user.Level);
set(ST_RealName, MUIA_String_Contents, user.RealName);
set(ST_Street, MUIA_String_Contents, user.Street);
set(ST_City, MUIA_String_Contents, user.City);
set(ST_Phone, MUIA_String_Contents, user.Phone);
set(ST_Prompt, MUIA_String_Contents, user.Prompt);
set(SL_PageLen, MUIA_Slider_Level, (ULONG)user.PageLen);
set(SL_LineLen, MUIA_Slider_Level, (ULONG)user.LineLen);
set(ST_Quota, MUIA_String_Integer, user.Quota);
for(num = 0; num < 32; num++)
DoMethod(LV_AccBits, MUIM_List_Select, num, MUIV_List_Select_Off, NULL);
num = 0;
acc = user.AccessBits;
while(acc)
{
if(acc & 1)
DoMethod(LV_AccBits, MUIM_List_Select, num, MUIV_List_Select_On, NULL);
acc = acc / 2;
num++;
}
num = 0;
if(user.Flags & UF_RMODE_NEW)
num = 1;
else if(user.Flags & UF_RMODE_SEL)
num = 2;
else if(user.Flags & UF_RMODE_THRD)
num = 3;
set(CY_ReadMode, MUIA_Cycle_Active, num);
set(CY_CharSet, MUIA_Cycle_Active, user.CharSet);
set(CY_Terminal, MUIA_Cycle_Active, (user.Flags & UF_EMU_ANSI) ? 1 : 0);
set(CY_Editor, MUIA_Cycle_Active, (user.Flags & UF_SCREEN_ED) ? 1 : 0);
set(CH_AutoList, MUIA_Selected, (user.Flags & UF_AUTO_LIST) ? TRUE : FALSE);
set(CH_AutoAreaList, MUIA_Selected, (user.Flags & UF_AUTO_AREALIST) ? TRUE : FALSE);
set(CH_WriteAcc, MUIA_Selected, (user.Flags & UF_EXTSEND) ? TRUE : FALSE);
set(CH_MsgHead, MUIA_Selected, (user.Flags & UF_HEAD_LONG) ? TRUE : FALSE);
set(CH_Input, MUIA_Selected, (user.Flags & UF_EDIT_INSERT) ? TRUE : FALSE);
set(CH_ClearScreen, MUIA_Selected, (user.Flags & UF_CLS) ? TRUE : FALSE);
ULONG edopen;
set(WI_Editor, MUIA_Window_Open, TRUE);
get(WI_Editor, MUIA_Window_Open, &edopen);
if(!edopen)
{
MUI_RequestA(App, NULL, 0, "KMSUM Error", "I see", "Couldn't open window!", NULL);
if(addflag)
DeleteUN(un);
addflag = FALSE;
if(Username)
DoMethod(App, MUIM_Application_ReturnID, MID_OK);
}
else
set(WI_Manager, MUIA_Window_Sleep, TRUE);
DoMethod(WI_Editor, MUIM_Window_ScreenToFront,);
}
else
{
DisplayBeep(0);
if(Username)
DoMethod(App, MUIM_Application_ReturnID, MID_OK);
}
break;
case MID_OK:
case MUIV_Application_ReturnID_Quit:
if(addflag)
DeleteUN(un);
addflag = FALSE;
/* Liste sichern */
if(!Username || !FindPort("KMS"))
{
set(App, MUIA_Application_Sleep, TRUE);
if(userschanged && !WriteUserList())
MUI_RequestA(App, NULL, 0, "KMSUM Error", "I see", "Saving userlist failed!", NULL);
if(bitschanged && !WriteAccBits())
MUI_RequestA(App, NULL, 0, "KMSUM Error", "I see", "Saving access bits failed!", NULL);
set(App, MUIA_Application_Sleep, FALSE);
}
else if(userschanged)
KMSBase->Modified |= MODIFIED_USERS;
if(!MakeChanges())
MUI_RequestA(App, NULL, 0, "KMSUM Error", "I see", "Executing DOS changes failed!", NULL);
running = FALSE;
break;
case MID_SELUSER:
set(WI_Manager, MUIA_Window_ActiveObject, LV_Users);
break;
case EID_SELAB:
set(WI_Editor, MUIA_Window_ActiveObject, LV_AccBits);
get(LV_AccBits, MUIA_List_Active, &num);
set(ST_AccBit, MUIA_String_Contents, AccBitNames[num]);
break;
case EID_NAMEAB:
STRPTR text;
get(LV_AccBits, MUIA_List_Active, &num);
get(ST_AccBit, MUIA_String_Contents, &text);
strcpy(AccBitNames[num], text);
DoMethod(LV_AccBits, MUIM_List_Redraw, MUIV_List_Redraw_Active);
bitschanged = TRUE;
break;
case EID_USE:
STRPTR text;
ULONG value;
TEXT userdir[LEN_DOSPATH+1];
strcpy(userdir, KMSBase->UserDir);
get(ST_Name, MUIA_String_Contents, &text);
strcpy(user.Name, text);
ConvertSpace(user.Name);
get(ST_Password, MUIA_String_Contents, &text);
strcpy(password, text);
get(SL_Level, MUIA_Slider_Level, &value);
user.Level = (UWORD)value;
get(ST_RealName, MUIA_String_Contents, &text);
strcpy(user.RealName, text);
get(ST_Street, MUIA_String_Contents, &text);
strcpy(user.Street, text);
get(ST_City, MUIA_String_Contents, &text);
strcpy(user.City, text);
get(ST_Phone, MUIA_String_Contents, &text);
strcpy(user.Phone, text);
get(ST_Prompt, MUIA_String_Contents, &text);
strcpy(user.Prompt, text);
get(SL_PageLen, MUIA_Slider_Level, &value);
user.PageLen = (UBYTE)value;
get(SL_LineLen, MUIA_Slider_Level, &value);
user.LineLen = (UBYTE)value;
get(ST_Quota, MUIA_String_Integer, &value);
user.Quota = (UWORD)value;
acc = 1;
user.AccessBits = 0;
for(num = 0; num < 32; num++)
{
DoMethod(LV_AccBits, MUIM_List_Select, num, MUIV_List_Select_Ask, &state);
if(state == MUIV_List_Select_On)
user.AccessBits |= acc;
acc = acc << 1;
}
user.Flags = 0;
get(CY_ReadMode, MUIA_Cycle_Active, &num);
if(num == 1)
user.Flags |= UF_RMODE_NEW;
else if(num == 2)
user.Flags |= UF_RMODE_SEL;
else if(num == 3)
user.Flags |= UF_RMODE_THRD;
get(CY_CharSet, MUIA_Cycle_Active, &num);
user.CharSet = (UBYTE)num;
get(CY_Terminal, MUIA_Cycle_Active, &num);
if(num == 1)
user.Flags |= UF_EMU_ANSI;
get(CY_Editor, MUIA_Cycle_Active, &num);
if(num == 1)
user.Flags |= UF_SCREEN_ED;
get(CH_MsgHead, MUIA_Selected, &num);
if(num)
user.Flags |= UF_HEAD_LONG;
get(CH_Input, MUIA_Selected, &num);
if(num)
user.Flags |= UF_EDIT_INSERT;
get(CH_AutoList, MUIA_Selected, &num);
if(num)
user.Flags |= UF_AUTO_LIST;
get(CH_AutoAreaList, MUIA_Selected, &num);
if(num)
user.Flags |= UF_AUTO_AREALIST;
get(CH_WriteAcc, MUIA_Selected, &num);
if(num)
user.Flags |= UF_EXTSEND;
get(CH_ClearScreen, MUIA_Selected, &num);
if(num)
user.Flags |= UF_CLS;
if(!addflag && strcmp(un->UserData.Name, user.Name))
{
Changes = fopen(ChangesFile, "a");
if(Changes)
{
fprintf(Changes, "Rename >NIL: \"%s%s\" \"%s%s\"\n", userdir, un->UserData.Name, userdir, user.Name);
fclose(Changes);
}
}
un->UserData = user;
if(addflag)
{
/* UMS-User erzeugen */
if (AddUMSUser(un))
{
/* User in Liste aufnehmen */
DoMethod(LV_Users, MUIM_List_Insert, &un, 1, MUIV_List_Insert_Bottom);
set(LV_Users, MUIA_List_Active, MUIV_List_Active_Bottom);
/* User-Directory anlegen */
Changes = fopen(ChangesFile, "a");
if(Changes)
{
fprintf(Changes, "MakeDir >NIL: \"%s%s\"\n", userdir, user.Name);
if (UserCheck("Default"))
fprintf(Changes, "Copy >NIL: \"%sDefault\" \"%s%s\"\n", userdir, userdir, user.Name);
else
fprintf(Changes, "Copy >NIL: \"%sLOGIN.COM\" \"%s%s\"\n", userdir, userdir, user.Name);
fclose(Changes);
}
addflag = FALSE;
}
}
else
DoMethod(LV_Users, MUIM_List_Redraw, MUIV_List_Redraw_Active);
if(strlen(password))
{
if(!strcmp(password, " "))
*password = '\0';
/* Neues Paßwort in ums.config festhalten */
WriteUMSConfigTags(SysUMSAccount, UMSTAG_CfgUser, user.RealName,
UMSTAG_CfgName, "PASSWORD",
UMSTAG_CfgData, password,
TAG_DONE);
}
userschanged = TRUE;
// no break!
case EID_CANCEL:
if(addflag)
DeleteUN(un);
addflag = FALSE;
set(WI_Editor, MUIA_Window_Open, FALSE);
set(WI_Manager, MUIA_Window_Sleep, FALSE);
if(Username)
DoMethod(App, MUIM_Application_ReturnID, MID_OK);
break;
}
if(running && signal)
Wait(signal);
}
Sense(App, NULL);
}
///
/*********************************
* Neue Userdatei anlegen *
*********************************
* I: --- *
* O: Erfolg TRUE/FALSE *
*********************************/
/// "InitUAF"
BOOL InitUAF(VOID)
{
FILE *file;
struct Userdaten user;
TEXT buffer[LEN_DOSPATH+1];
TEXT buff[LEN_DOSPATH*2+LEN_USERNAME+21+1];
BPTR lock;
TakeUSem(TRUE);
strcpy(buffer, KMSBase->DatDir);
strcat(buffer, "KMS_UAF.DAT");
if(!(file = fopen(buffer, "w")))
{
DropUSem();
return FALSE;
}
/* KMS-System-Account */
clrmem(&user, sizeof(struct Userdaten));
user.ID = 1;
user.CharSet = 0;
user.Flags = UF_EMU_ANSI|UF_EDIT_INSERT|UF_AUTO_LIST|UF_AUTO_AREALIST|UF_RMODE_NEW|UF_SCREEN_ED;
strcpy(user.Name, "System");
strcpy(user.RealName, "KMS System");
strcpy(user.City, "Ankh-Morpork");
user.Level = 255;
user.LineLen = 80;
user.PageLen = 25;
user.Quota = 10;
strcpy(user.Prompt, "System> ");
fprintf(file, "%d\n%s\n%s\n%s\n", user.ID,
user.Name,
user.RealName,
user.Street);
fprintf(file, "%s\n%s\n%s\n", user.City,
user.Phone,
user.Prompt);
fprintf(file, "%d\n%d\n%ld\n", user.Level,
user.Calls,
user.LastCall);
fprintf(file, "%d\n%d\n%d\n%d\n", user.CharSet,
user.PageLen,
user.LineLen,
user.Protocol);
fprintf(file, "%ld\n%ld\n%d\n \n", user.Flags,
user.AccessBits,
user.Quota);
/* Leeres Paßwort in ums.config festhalten */
WriteUMSConfigTags(SysUMSAccount, UMSTAG_CfgUser, user.RealName,
UMSTAG_CfgName, "PASSWORD",
UMSTAG_CfgData, "",
TAG_DONE);
/* User-Directory anlegen */
strcpy(buffer, KMSBase->UserDir);
strcat(buffer, user.Name);
if(lock = CreateDir(buffer))
{
UnLock(lock);
/* LOGIN.COM kopieren */
sprintf(buff, "Copy >NIL: %sLOGIN.COM %s", KMSBase->UserDir, buffer);
system(buff);
}
/* KMS-Default-Account */
clrmem(&user, sizeof(struct Userdaten));
user.ID = 2;
user.CharSet = 0;
user.Flags = UF_EMU_ANSI|UF_EDIT_INSERT|UF_AUTO_LIST|UF_AUTO_AREALIST|UF_RMODE_NEW|UF_SCREEN_ED;
strcpy(user.Name, "Default");
strcpy(user.RealName, "KMS Default");
strcpy(user.City, "Pern");
user.Level = 10;
user.LineLen = 80;
user.PageLen = 25;
user.Quota = 10;
strcpy(user.Prompt, "[%p]> ");
fprintf(file, "%d\n%s\n%s\n%s\n", user.ID,
user.Name,
user.RealName,
user.Street);
fprintf(file, "%s\n%s\n%s\n", user.City,
user.Phone,
user.Prompt);
fprintf(file, "%d\n%d\n%ld\n", user.Level,
user.Calls,
user.LastCall);
fprintf(file, "%d\n%d\n%d\n%d\n", user.CharSet,
user.PageLen,
user.LineLen,
user.Protocol);
fprintf(file, "%ld\n%ld\n%d\n\n", user.Flags,
user.AccessBits,
user.Quota);
/* Leeres Paßwort in ums.config festhalten */
WriteUMSConfigTags(SysUMSAccount, UMSTAG_CfgUser, user.RealName,
UMSTAG_CfgName, "PASSWORD",
UMSTAG_CfgData, "",
TAG_DONE);
/* User-Directory anlegen */
strcpy(buffer, KMSBase->UserDir);
strcat(buffer, user.Name);
if (lock = CreateDir(buffer))
{
UnLock(lock);
/* LOGIN.COM kopieren */
sprintf(buff, "Copy >NIL: %sLOGIN.COM %s", KMSBase->UserDir, buffer);
system(buff);
}
/* GAST-Account */
clrmem(&user, sizeof(struct Userdaten));
user.ID = 3;
user.CharSet = 0;
user.Flags = UF_EMU_ANSI|UF_EDIT_INSERT|UF_AUTO_LIST|UF_AUTO_AREALIST|UF_RMODE_NEW|UF_SCREEN_ED;
strcpy(user.Name, "Gast");
strcpy(user.RealName, "KMS Gast");
strcpy(user.City, "Ankh-Morpork");
user.Level = 1;
user.LineLen = 80;
user.PageLen = 25;
user.Quota = 0;
strcpy(user.Prompt, "[%p]> ");
fprintf(file, "%d\n%s\n%s\n%s\n", user.ID,
user.Name,
user.RealName,
user.Street);
fprintf(file, "%s\n%s\n%s\n", user.City,
user.Phone,
user.Prompt);
fprintf(file, "%d\n%d\n%ld\n", user.Level,
user.Calls,
user.LastCall);
fprintf(file, "%d\n%d\n%d\n%d\n", user.CharSet,
user.PageLen,
user.LineLen,
user.Protocol);
fprintf(file, "%ld\n%ld\n%d\n \n", user.Flags,
user.AccessBits,
user.Quota);
/* Leeres Paßwort in ums.config festhalten */
WriteUMSConfigTags(SysUMSAccount, UMSTAG_CfgUser, user.RealName,
UMSTAG_CfgName, "PASSWORD",
UMSTAG_CfgData, "",
TAG_DONE);
/* User-Directory anlegen */
strcpy(buffer, KMSBase->UserDir);
strcat(buffer, user.Name);
if(lock = CreateDir(buffer))
UnLock(lock);
fclose(file);
DropUSem();
return TRUE;
}
///
/*********************************
* UserList einlesen *
*********************************
* I: --- *
* O: Erfolg? TRUE/FALSE *
*********************************/
/// "ReadUserList"
BOOL ReadUserList(VOID)
{
struct UserNode *upoint;
struct Userdaten user;
TEXT buffer[LEN_DOSPATH+1];
TEXT buff[LEN_REALNAME+2]; /* RealName ist eines der laengsten Elemente */
FILE *file;
/* Wenn schon eingelesen, fertig */
upoint = (struct UserNode *)KMSBase->UserList.mlh_Head;
if(upoint->Node.mln_Succ)
return TRUE;
/* Einlesen */
TakeUSem(TRUE);
strcpy(buffer, KMSBase->DatDir);
strcat(buffer, "KMS_UAF.DAT");
if(!(file = fopen(buffer, "r")))
{
DropUSem();
return FALSE;
}
else
{
while(fgets(buff, LEN_NUMBER+2, file))
{
if(!(upoint = (struct UserNode *)AllocMem((ULONG)sizeof(struct UserNode), MEMF_PUBLIC|MEMF_CLEAR)))
{
Error("out of memory.");
fclose(file);
DropUSem();
return FALSE;
}
clrmem(&user, sizeof(struct Userdaten));
user.ID = (UWORD)atoi(buff);
if(fgets(buff, LEN_USERNAME+2, file))
{
if(strlen(buff))
buff[strlen(buff)-1] = '\0'; /* Linefeed am Ende entfernen */
strcpy(user.Name, buff);
}
if(fgets(buff, LEN_REALNAME+2, file))
{
if(strlen(buff))
buff[strlen(buff)-1] = '\0'; /* Linefeed am Ende entfernen */
strcpy(user.RealName, buff);
}
if(fgets(buff, LEN_STREET+2, file))
{
if(strlen(buff))
buff[strlen(buff)-1] = '\0'; /* Linefeed am Ende entfernen */
strcpy(user.Street, buff);
}
if(fgets(buff, LEN_CITY+2, file))
{
if(strlen(buff))
buff[strlen(buff)-1] = '\0'; /* Linefeed am Ende entfernen */
strcpy(user.City, buff);
}
if(fgets(buff, LEN_PHONE+2, file))
{
if(strlen(buff))
buff[strlen(buff)-1] = '\0';
strcpy(user.Phone, buff);
}
if(fgets(buff, LEN_UPROMPT+2, file))
{
if(strlen(buff))
buff[strlen(buff)-1] = '\0';
strcpy(user.Prompt, buff);
}
if(fgets(buff, LEN_NUMBER+2, file))
user.Level = (UWORD)atoi(buff);
if(fgets(buff, LEN_NUMBER+2, file))
user.Calls = (UWORD)atoi(buff);
if(fgets(buff, LEN_NUMBER+2, file))
user.LastCall = (ULONG)atol(buff);
if(fgets(buff, LEN_NUMBER+2, file))
user.CharSet = (UBYTE)atoi(buff);
if(fgets(buff, LEN_NUMBER+2, file))
user.PageLen = (UBYTE)atoi(buff);
if(fgets(buff, LEN_NUMBER+2, file))
user.LineLen = (UBYTE)atoi(buff);
if(fgets(buff, LEN_NUMBER+2, file))
user.Protocol = (UBYTE)atoi(buff);
if(fgets(buff, LEN_NUMBER+2, file))
user.Flags = (ULONG)atol(buff);
if(fgets(buff, LEN_NUMBER+2, file))
user.AccessBits = (ULONG)atol(buff);
if(fgets(buff, LEN_NUMBER+2, file))
user.Quota = (UWORD)atoi(buff);
if(fgets(buff, 15+2, file))
{
if(strlen(buff))
buff[strlen(buff)-1] = '\0';
}
upoint->UserData = user;
AddTail((struct List *)&KMSBase->UserList, (struct Node *)upoint);
}
fclose(file);
}
DropUSem();
return TRUE;
}
///
/*********************************
* UserList schreiben *
*********************************
* I: --- *
* O: Erfolg? TRUE/FALSE *
*********************************/
/// "WriteUserList"
/*
struct Userdaten
{
UWORD ID;
TEXT Name[LEN_USERNAME+1];
TEXT RealName[LEN_REALNAME+1];
TEXT Street[LEN_STREET+1];
TEXT City[LEN_CITY+1];
TEXT Phone[LEN_PHONE+1];
TEXT Prompt[LEN_UPROMPT+1];
UWORD Level;
UWORD Calls;
time_t LastCall;
UBYTE CharSet;
UBYTE PageLen;
UBYTE LineLen;
UBYTE Protocol;
ULONG Flags;
ULONG AccessBits;
UWORD Quota;
};
*/
BOOL WriteUserList(VOID)
{
struct UserNode *upoint;
TEXT buffer[LEN_DOSPATH+1];
FILE *file;
ULONG num;
strcpy(buffer, KMSBase->DatDir);
strcat(buffer, "KMS_UAF.DAT");
TakeUSem(TRUE);
file = fopen(buffer, "w");
if(!file)
{
DropUSem();
return FALSE;
}
for(num = 0; ; num++)
{
DoMethod(LV_Users, MUIM_List_GetEntry, num, &upoint);
if(!upoint)
break;
upoint->UserData.ID = num + 1;
fprintf(file,"%d\n%s\n%s\n%s\n", upoint->UserData.ID,
upoint->UserData.Name,
upoint->UserData.RealName,
upoint->UserData.Street);
fprintf(file,"%s\n%s\n%s\n", upoint->UserData.City,
upoint->UserData.Phone,
upoint->UserData.Prompt);
fprintf(file,"%d\n%d\n%ld\n", upoint->UserData.Level,
upoint->UserData.Calls,
upoint->UserData.LastCall);
fprintf(file,"%d\n%d\n%d\n%d\n", upoint->UserData.CharSet,
upoint->UserData.PageLen,
upoint->UserData.LineLen,
upoint->UserData.Protocol);
fprintf(file,"%ld\n%ld\n%d\n\n", upoint->UserData.Flags,
upoint->UserData.AccessBits,
upoint->UserData.Quota);
}
fclose(file);
DropUSem();
return TRUE;
}
///
/********************************
* Neuen UserNode einrichten *
********************************
* I: --- *
* O: struct UserNode * *
********************************/
/// "AddUN"
struct UserNode *AddUN(VOID)
{
struct UserNode *upoint, *newupoint;
UWORD id, maxid;
upoint = (struct UserNode *)KMSBase->UserList.mlh_TailPred;
if(!upoint->Node.mln_Pred)
{
MUI_RequestA(App, NULL, 0, "KMSUM Error", "I see", "No UserList!?", NULL);
return NULL;
}
maxid = 0; id = 0;
upoint = (struct UserNode *)KMSBase->UserList.mlh_Head;
while(upoint->Node.mln_Succ)
{
id = upoint->UserData.ID;
if(id > maxid)
maxid = id;
upoint = (struct UserNode *)upoint->Node.mln_Succ;
}
maxid++;
if(maxid == 0) /* Überlauf */
{
MUI_RequestA(App, NULL, 0, "KMSUM Error", "I see", "Too many users!", NULL);
return NULL;
}
if(!(newupoint = (struct UserNode *)AllocMem((ULONG)sizeof(struct UserNode), MEMF_PUBLIC|MEMF_CLEAR)))
{
MUI_RequestA(App, NULL, 0, "KMSUM Error", "I see", "Out of memory!", NULL);
return NULL;
}
newupoint->UserData.ID = maxid;
AddTail((struct List *)&KMSBase->UserList, (struct Node *)newupoint);
return newupoint;
}
///
/********************************
* UserNode löschen *
********************************
* I: struct UserNode * *
* O: --- *
********************************/
/// "DeleteUN"
VOID DeleteUN(struct UserNode *un)
{
if(!un)
return;
Remove((struct Node *)un);
FreeMem(un, (ULONG)sizeof(struct UserNode));
}
///
/**********************************
* Username auf Gültigkeit prüfen *
**********************************
* I: Name *
* O: struct UserNode * *
**********************************/
/// "UserCheck"
struct UserNode *UserCheck(STRPTR name)
{
struct UserNode *upoint;
if(!name || !strlen(name))
return NULL;
ConvertSpace(name);
TakeUSem(FALSE);
upoint = (struct UserNode *)KMSBase->UserList.mlh_Head;
while(upoint->Node.mln_Succ)
{
if(!stricmp(name, upoint->UserData.Name))
{
DropUSem();
return upoint;
}
upoint = upoint->Node.mln_Succ;
}
DropUSem();
return NULL;
}
///
/****************************
* Parse Arguments *
****************************
* I: --- *
* O: Error: FALSE Ok: TRUE *
****************************/
/// "ParseArgs"
#define TEMPLATE "USERNAME"
STRPTR HelpTxt = "\nUsage:\n\nUSERNAME optional: User to edit\n\n";
BOOL ParseArgs(VOID)
{
UBYTE n;
ULONG args[1];
struct RDArgs *rargs = NULL;
struct RDArgs *myrdargs = NULL;
for(n = 0; n < 1; n++)
args[n] = 0;
myrdargs = AllocDosObjectTags(DOS_RDARGS, TAG_DONE);
if(!myrdargs)
{
PrintFault(IoErr(), NULL);
return FALSE;
}
myrdargs->RDA_ExtHelp = HelpTxt;
if(!(rargs = (struct RDArgs *)ReadArgs(TEMPLATE, args, myrdargs)))
{
PrintFault(IoErr(), NULL);
FreeDosObject(DOS_RDARGS, myrdargs);
return FALSE;
}
if(args[0]) /* USERNAME */
{
Username = (STRPTR)strdup((STRPTR)args[0]);
ConvertSpace(Username);
}
FreeArgs(rargs);
FreeDosObject(DOS_RDARGS, myrdargs);
return TRUE;
}
///
/****************************
* Sense *
****************************
* I: --- *
* O: --- *
****************************/
/// "Sense"
VOID Sense(APTR app, STRPTR str)
{
if(app)
MUI_DisposeObject(app);
if(Username)
free(Username);
if(KMSBase)
{
/* Von der Basis abmelden */
ReleaseSemaphore(&KMSBase->BaseSem);
/* KMSBase gegebenenfalls wieder entfernen */
Forbid();
if(KMSBase = (struct KMSBase *)FindSemaphore(KMSBASENAME))
{
if(AttemptSemaphore(&KMSBase->BaseSem))
{
Permit();
/* Arealiste freigeben */
struct AreaNode *apoint = KMSBase->AreaList.mlh_Head;
while(apoint->Node.mln_Succ)
{
struct AreaNode *nextapoint = apoint->Node.mln_Succ;
Remove((struct Node *)apoint);
FreeMem(apoint, (ULONG)sizeof(struct AreaNode));
apoint = nextapoint;
}
/* Userliste freigeben */
struct UserNode *upoint = KMSBase->UserList.mlh_Head;
while(upoint->Node.mln_Succ)
{
struct UserNode *nextupoint = upoint->Node.mln_Succ;
Remove((struct Node *)upoint);
FreeMem(upoint, (ULONG)sizeof(struct UserNode));
upoint = nextupoint;
}
if(KMSBase->DatDir)
FreeMem(KMSBase->DatDir, strlen(KMSBase->DatDir) + 1);
if(KMSBase->UserDir)
FreeMem(KMSBase->UserDir, strlen(KMSBase->UserDir) + 1);
RemSemaphore(&KMSBase->BaseSem);
ObtainSemaphore(&KMSBase->UserSem);
ReleaseSemaphore(&KMSBase->UserSem);
ObtainSemaphore(&KMSBase->AreaSem);
ReleaseSemaphore(&KMSBase->AreaSem);
ObtainSemaphore(&KMSBase->SaveSem);
ReleaseSemaphore(&KMSBase->SaveSem);
ReleaseSemaphore(&KMSBase->BaseSem);
FreeMem(KMSBase->BaseSem.ss_Link.ln_Name, sizeof(KMSBASENAME)+1);
FreeMem(KMSBase, sizeof(struct KMSBase));
}
else
Permit();
}
else
Permit();
}
if(UMSBase)
{
if(SysUMSAccount)
UMSLogout(SysUMSAccount);
CloseLibrary(UMSBase);
}
if(str)
{
fputs(str, stderr);
fputs("\n", stderr);
exit(20);
}
if(ChangesFile && strlen(ChangesFile))
DeleteFile(ChangesFile);
exit(0);
}
///
/****************************
* AccessBits einlesen *
****************************
* I: --- *
* O: --- *
****************************/
/// "ReadAccBits"
VOID ReadAccBits(VOID)
{
TEXT dos[LEN_DOSPATH+1];
TEXT buff[LEN_NUMBER+LEN_ACCBITNAME+2];
UWORD n;
FILE *datei;
strcpy(dos, KMSBase->DatDir);
strcat(dos, "KMS_SYSTEM.DAT");
ObtainSemaphore(&KMSBase->SaveSem);
SystemStartups = 1;
for(n = 0; n < 32; n++)
sprintf(AccBitNames[n], "[Bit#%02d]", n+1);
if(datei = fopen(dos, "r"))
{
fgets(buff, LEN_NUMBER+2, datei);
SystemStartups = atol(buff) + 1;
for(n = 0; n < 32; n++)
{
*buff = '\0';
if(fgets(buff, LEN_ACCBITNAME+2, datei))
buff[strlen(buff)-1] = '\0';
if(!strlen(buff))
sprintf(AccBitNames[n], "[Bit#%02d]", n+1);
else
strcpy(AccBitNames[n], buff);
}
fclose(datei);
}
ReleaseSemaphore(&KMSBase->SaveSem);
}
///
/***************************
* AccessBits speichern *
***************************
* I: --- *
* O: Erfolg TRUE/FALSE *
***************************/
/// "WriteAccBits"
BOOL WriteAccBits(VOID)
{
FILE *datei;
TEXT dos[LEN_DOSPATH+1];
UBYTE n;
ObtainSemaphore(&KMSBase->SaveSem);
strcpy(dos, KMSBase->DatDir);
strcat(dos, "KMS_SYSTEM.DAT");
datei = fopen(dos, "w");
if(datei)
{
fprintf(datei, "%ld\n", SystemStartups);
for(n = 0; n < 32; n++)
fprintf(datei, "%s\n", AccBitNames[n]);
fclose(datei);
}
ReleaseSemaphore(&KMSBase->SaveSem);
if(datei)
return TRUE;
else
return FALSE;
}
///
/***************************
* "Execute Changes" *
***************************
* I: --- *
* O: Erfolg TRUE/FALSE *
***************************/
/// "MakeChanges"
BOOL MakeChanges(VOID)
{
TEXT buff[256];
FILE *file;
if(file = fopen(ChangesFile, "r"))
{
fclose(file);
sprintf(buff, "Execute %s", ChangesFile);
system(buff);
}
return TRUE;
}
///
/********************************
* KMSBase besorgen *
********************************
* I: --- *
* O: struct KMSBase * *
********************************/
/// "GetKMSBase"
struct KMSBase *GetKMSBase(VOID)
{
STRPTR bname;
STRPTR string;
UMSBase = (struct Library *)OpenLibrary(UMSNAME, 0);
if(!UMSBase)
{
Error("couldn't open ums.library.");
return NULL;
}
TEXT varbuff[32] = "";
TEXT pwbuff[32] = "";
GetVar("KMSMB", varbuff, sizeof(varbuff), NULL);
GetVar("KMSPWD", pwbuff, sizeof(pwbuff), NULL);
if(!(SysUMSAccount = UMSRLogin(varbuff, "KMS", pwbuff)))
{
Error("couldn't log into UMS.");
return NULL;
}
/* KMSBase erzeugen, falls nicht vorhanden */
Forbid();
if(!(KMSBase = (struct KMSBase *)FindSemaphore(KMSBASENAME)))
{
bname = AllocMem((ULONG)sizeof(KMSBASENAME)+1, MEMF_PUBLIC|MEMF_CLEAR);
if(bname)
{
strcpy(bname, KMSBASENAME);
if(KMSBase = AllocMem((ULONG)sizeof(struct KMSBase), MEMF_PUBLIC|MEMF_CLEAR))
{
KMSBase->BaseSem.ss_Link.ln_Pri = 0;
KMSBase->BaseSem.ss_Link.ln_Name = bname;
KMSBase->UserSem.ss_Link.ln_Pri = 0;
KMSBase->UserSem.ss_Link.ln_Name = NULL;
KMSBase->AreaSem.ss_Link.ln_Pri = 0;
KMSBase->AreaSem.ss_Link.ln_Name = NULL;
KMSBase->SaveSem.ss_Link.ln_Pri = 0;
KMSBase->SaveSem.ss_Link.ln_Name = NULL;
NewList((struct List *)&KMSBase->AreaList);
NewList((struct List *)&KMSBase->UserList);
AddSemaphore(&KMSBase->BaseSem);
InitSemaphore(&KMSBase->UserSem);
InitSemaphore(&KMSBase->AreaSem);
InitSemaphore(&KMSBase->SaveSem);
ObtainSemaphore(&KMSBase->BaseSem);
Permit();
if(string = ReadUMSConfigTags(SysUMSAccount, UMSTAG_CfgName, "KMS.datdir", TAG_DONE))
{
KMSBase->DatDir = AllocMem((ULONG)(strlen(string)+1), MEMF_PUBLIC|MEMF_CLEAR);
if(KMSBase->DatDir)
strcpy(KMSBase->DatDir, string);
FreeUMSConfig(SysUMSAccount, string);
if(!KMSBase->DatDir)
{
Error("out of memory.");
return NULL;
}
}
else
{
KMSBase->DatDir = AllocMem((ULONG)(strlen("Data/")+1), MEMF_PUBLIC|MEMF_CLEAR);
if(KMSBase->DatDir)
strcpy(KMSBase->DatDir, "Data/");
else
{
Error("out of memory.");
return NULL;
}
}
if(string = ReadUMSConfigTags(SysUMSAccount, UMSTAG_CfgName, "KMS.userdir", TAG_DONE))
{
KMSBase->UserDir = AllocMem((ULONG)(strlen(string)+1), MEMF_PUBLIC|MEMF_CLEAR);
if(KMSBase->UserDir)
strcpy(KMSBase->UserDir, string);
FreeUMSConfig(SysUMSAccount, string);
if(!KMSBase->UserDir)
{
Error("out of memory.");
return NULL;
}
}
else
{
KMSBase->UserDir = AllocMem((ULONG)(strlen("User/")+1), MEMF_PUBLIC|MEMF_CLEAR);
if(KMSBase->UserDir)
strcpy(KMSBase->UserDir, "User/");
else
{
Error("out of memory.");
return NULL;
}
}
ReleaseSemaphore(&KMSBase->BaseSem);
ObtainSemaphoreShared(&KMSBase->BaseSem);
}
else
{
Permit();
if(bname)
FreeMem(bname, sizeof(KMSBASENAME)+1);
Error("out of memory.");
return NULL;
}
}
else
{
Permit();
Error("out of memory.");
return NULL;
}
}
else
{
Permit();
ObtainSemaphoreShared(&KMSBase->BaseSem);
}
/* Userliste einlesen oder anlegen, falls nicht vorhanden */
if(!ReadUserList())
{
InitUAF();
if(!ReadUserList())
{
Error("couldn't create or read KMS_UAF.DAT");
return NULL;
}
}
ReadAccBits();
return KMSBase;
}
///
/********************************
* Standardfehlerausgabe *
********************************
* I: --- *
* O: --- *
********************************/
/// "Error"
VOID Error(STRPTR errtxt)
{
if(errtxt)
{
fputs(errtxt, stderr);
fputs("\n", stderr);
}
}
///
/********************************
* Leerzeichen -> Underscore *
********************************
* I: STRPTR *
* O: --- *
********************************/
/// "ConvertSpace"
VOID ConvertSpace(STRPTR string)
{
if(!string)
return;
while(*string)
{
if(*string == ' ')
*string = '_';
string++;
}
}
///
/// "TakeUSem"
VOID TakeUSem(BOOL exclusive)
{
if(exclusive)
ObtainSemaphore(&KMSBase->UserSem);
else
ObtainSemaphoreShared(&KMSBase->UserSem);
}
///
/// "DropUSem"
VOID DropUSem(VOID)
{
ReleaseSemaphore(&KMSBase->UserSem);
}
///
/// "TakeMSem"
VOID TakeMSem(BOOL exclusive)
{
if(exclusive)
ObtainSemaphore(&KMSBase->SaveSem);
else
ObtainSemaphoreShared(&KMSBase->SaveSem);
}
///
/// "DropMSem"
VOID DropMSem(VOID)
{
ReleaseSemaphore(&KMSBase->SaveSem);
}
///
/********************************
* UMS-Usereintrag erzeugen *
********************************
* I: struct UserNode * *
* O: Erfolg TRUE/FALSE *
********************************/
/// AddUMSUser
BOOL AddUMSUser(struct UserNode *unode)
{
if (!WriteUMSConfigTags(SysUMSAccount, UMSTAG_CfgCreateUser, unode->UserData.RealName,
TAG_DONE))
return FALSE;
if (WriteUMSConfigTags(SysUMSAccount, UMSTAG_CfgUser, unode->UserData.RealName,
UMSTAG_CfgCreateAlias, unode->UserData.Name,
TAG_DONE))
if (WriteUMSConfigTags(SysUMSAccount, UMSTAG_CfgUser, unode->UserData.RealName,
UMSTAG_CfgName, "READACCESS",
UMSTAG_CfgData, "#?",
TAG_DONE))
if (WriteUMSConfigTags(SysUMSAccount, UMSTAG_CfgUser, unode->UserData.RealName,
UMSTAG_CfgName, "WRITEACCESS",
UMSTAG_CfgData, "#?",
TAG_DONE))
if (WriteUMSConfigTags(SysUMSAccount, UMSTAG_CfgUser, unode->UserData.RealName,
UMSTAG_CfgName, "NETACCESS",
UMSTAG_CfgData, "#?",
TAG_DONE))
return TRUE;
WriteUMSConfigTags(SysUMSAccount, UMSTAG_CfgDeleteUser, unode->UserData.RealName,
TAG_DONE);
return FALSE;
}
///
/********************************
* UMS-Usereintrag löschen *
********************************
* I: struct UserNode * *
* O: Erfolg TRUE/FALSE *
********************************/
/// DelUMSUser
BOOL DelUMSUser(struct UserNode *unode)
{
if (!WriteUMSConfigTags(SysUMSAccount, UMSTAG_CfgDeleteUser, unode->UserData.RealName,
TAG_DONE))
return FALSE;
}
///